package com.biallen.datastructure.linkedlist;

import com.biallen.datastructure.entity.Node;
import org.omg.CORBA.NO_IMPLEMENT;

public class Josepfu {

    private Node first;


    public void buildCircleList(int nums) {

        if (nums < 2) {
            return;
        }
        Node tempNode = null;
        for (int i = 1; i <= nums; i++) {
            Node node = new Node(i);
            //构建头结点
            if (i == 1) {
                first = node;
                tempNode = first;
                first.setNext(first);//头结点首先自己指向自己
            } else {
                tempNode.setNext(node);
                tempNode = node;
                node.setNext(first);

            }
        }

        System.out.println("-----");

    }

    /**
     *
     * @param startNo
     * @param countNum
     * @param nums
     */
    public  void   jump(int startNo,int countNum ,int nums){

        Node  tempNode  =first;
        Node pre =null;//上一个节点
        while (tempNode!=null){
            pre=tempNode;
            if(tempNode.getNo()== startNo){
                break;
            }

            tempNode = tempNode.getNext();
        }

        int count =0;

        while (tempNode!=null){
            //当自己指向自己时 跳出出去
            if(tempNode.getNext()==tempNode){
                System.out.println("最后一个出圈:"+tempNode.getNo());
                break;
            }

            count++;
            if(count==countNum){
                System.out.println("小孩:"+tempNode.getNo()+" 出圈");
                pre.setNext(tempNode.getNext());
                count=0;
            }else {
                pre= tempNode;
            }
            //
            // 指针往后移
            tempNode = pre.getNext();

        }
    }

    public  void  jump1(){
        int num =3;
        Node node =first;
        while (node.getNext()!=node){
            for (int k=1;k<num-1;k++){
                node=node.getNext();
            }
            System.out.println(node.getNext().getNo()+" 出局");
            node.setNext(node.getNext().getNext());
            node=node.getNext();
        }
        System.out.println("最后一个出局:"+node.getNo());
    }

    public void count(int startNo, int countNum, int nums) {

        if (first == null || startNo < 1 || startNo > nums) {
            System.out.println("参数输入有误， 请重新输入");
            return;
        }
        // 创建要给辅助指针,帮助完成小孩出圈
        Node helper = first;

        while (true) {
            if (helper.getNext() == first) { // 说明 helper 指向最后小孩节点
                break;
            }
            helper = helper.getNext();
        }

        //当小孩报数时，让 first 和 helper 指针同时 的移动 m //这里是一个循环操作，知道圈中只有一个节点
        while (true) {
            if (helper == first) {
                //说明圈中只有一个节点
                break;
            }
            //让 first 和 helper 指针同时 的移动 countNum - 1
            for (int j = 0; j < countNum - 1; j++) {
                first = first.getNext();
                helper = helper.getNext();
            }


            System.out.printf("小孩%d 出圈\n", first.getNo()); //这时将 first 指向的小孩节点出圈
            first = first.getNext();
            helper.setNext(first); //

            System.out.printf("最后留在圈中的小孩编号%d \n", first.getNo());
        }

    }


    /**
     * 展示
     */
    public void shuowList() {

        Node curNode = first;

        while (true) {

            System.out.printf("打印节点%d \n", curNode.getNo());
            if (curNode.getNext() == first) {
                break;
            }
            curNode = curNode.getNext();
        }
    }


}
